共计 1584 个字符,预计需要花费 4 分钟才能阅读完成。
前言
在日常开发中,免不了读取各种各样的配置文件,比如 json、yml、properties、env、ini 等等格式的配置文件,今天我们将介绍在 Go 里面如何读取 yml 配置文件,并且根据不同的环境读取不同的配置~
准备
首先我们需要准备一份.yml 的配置文件,这里简单贴出一份(取名为app.yml
):
# app.yml
app:
id: 1000
name: juejin
db:
name: test
username: root
password: 123456
port: 3306
ticks:
- 100
- 200
- 300
maps:
1: 一
2: 二
3: 三
定义结构
配置文件定义好了,我们就需要根据配置文件的结构来定义 go 语言的结构体:
type App struct {
Id int
Name string
}
type DB struct {
Name string
Username string
Password string
Port int
}
type AppConfig struct {
App App
DB DB
Ticks []int
Maps map[int]string
}
读取
接下来就开始读取 yml 配置数据,这里我们需要用到一个依赖库:github.com/spf13/viper 来读取我们的 yml 文件,具体方法步骤如下:
func main() {wd, err := os.Getwd()
if err != nil {panic(err)
}
c := &AppConfig{}
v := viper.New()
v.SetConfigName("app") // 这里就是上面我们配置的文件名称,不需要带后缀名
v.AddConfigPath(wd) // 文件所在的目录路径
v.SetConfigType("yml") // 这里是文件格式类型
err = v.ReadInConfig()
if err != nil {log.Fatal("读取配置文件失败:", err)
return
}
configs := v.AllSettings()
for k, val := range configs {v.SetDefault(k, val)
}
err = v.Unmarshal(c) // 反序列化至结构体
if err != nil {log.Fatal("读取配置错误:", err)
}
}
多环境配置
在开发过程中,免不了多环境的切换,例如开发环境和测试环境的配置可能会有一些不同,不过每次都去改默认配置文件太麻烦了,不过我们可以设置环境变量以适配多环境的配置读取,最终代码为:
func main() {wd, err := os.Getwd()
if err != nil {panic(err)
}
c := &AppConfig{}
v := viper.New()
v.SetConfigName("app")
v.AddConfigPath(wd)
v.SetConfigType("yml")
err = v.ReadInConfig()
if err != nil {log.Fatal("读取配置文件失败:", err)
return
}
configs := v.AllSettings()
for k, val := range configs {v.SetDefault(k, val)
}
pa := os.Getenv("PROFILE_ACTIVE") // 读取环境变量中设置的当前生效配置名称
if pa != "" {v.SetConfigName(pa)
v.AddConfigPath(wd)
v.SetConfigType("yml")
err = v.ReadInConfig()
if err != nil {return}
}
err = v.Unmarshal(c)
if err != nil {log.Fatal("读取配置错误:", err)
}
}
后记
以上的方法都是基础简单的业务配置,且 viper
依赖也支持更多配置读取,如:JSON, TOML, YAML, HCL, envfile and Java properties;
😊 最后,感谢您的阅读,谢谢!
正文完
使用官方微信小程序体验更多功能